package Window; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map.Entry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import Builder.ShortcutKeyManager; import Builder.ShortcutKeyManager.ShortcutKeyT; public class ShortcutDlg extends Dialog { protected Object result; protected Shell shell; private Table table; private HashMap<ShortcutKeyT, String> newKeyMap; /** * Create the dialog. * * @param parent * @param style */ public ShortcutDlg(Shell parent, int style) { super(parent, style); setText("Shortcut Key Setting"); } /** * Open the dialog. * * @return the result */ public Object open() { createContents(); shell.open(); shell.layout(); Display display = getParent().getDisplay(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } return result; } /** * Create contents of the dialog. */ private void createContents() { shell = new Shell(getParent(), getStyle()); shell.setSize(800, 600); shell.setText(getText()); table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION); table.setBounds(10, 10, 774, 512); table.setHeaderVisible(true); table.setLinesVisible(true); Button btnNewButton = new Button(shell, SWT.NONE); btnNewButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { ShortcutKeyManager.getInstance().reset(); newKeyMap.clear(); createTable(); } }); btnNewButton.setBounds(10, 528, 75, 34); btnNewButton.setText("Reset"); Button btnCancel = new Button(shell, SWT.NONE); btnCancel.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { shell.dispose(); } }); btnCancel.setText("Cancel/Close"); btnCancel.setBounds(489, 528, 95, 34); Button btnApply = new Button(shell, SWT.NONE); btnApply.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { boolean hasProblem = false; for (Entry<ShortcutKeyT, String> entry : newKeyMap.entrySet()) { if (entry.getValue().equals("Duplicated!")) { hasProblem = true; break; } } if (hasProblem) { // pop up error dialog MessageBox msgBox = new MessageBox(shell, SWT.ICON_WARNING); msgBox.setMessage("Key mappings are duplicated. Please check it."); msgBox.open(); return; } LinkedHashMap<ShortcutKeyT, String> keyMap = ShortcutKeyManager .getInstance().getKeyMap(); for (Entry<ShortcutKeyT, String> entry : newKeyMap.entrySet()) { if (entry.getValue().equals("") == false) { keyMap.put(entry.getKey(), entry.getValue()); } } createTable(); ShortcutKeyManager.getInstance().writeKeyMapToFile(); } }); btnApply.setText("Apply"); btnApply.setBounds(408, 528, 75, 34); newKeyMap = new HashMap<ShortcutKeyT, String>(); createTable(); addSelectionListener(); shell.addListener(SWT.Traverse, new Listener() { public void handleEvent(Event e) { if (e.detail == SWT.TRAVERSE_ESCAPE) { e.doit = false; } } }); } private void createTable() { table.setVisible(false); table.removeAll(); String[] titles = { "Index", "Description", "Current Key", "New Key " }; for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) { TableColumn column = new TableColumn(table, SWT.NULL); column.setText(titles[loopIndex]); } int index = 0; for (Entry<ShortcutKeyT, String> entry : ShortcutKeyManager .getInstance().getKeyMap().entrySet()) { final TableItem item = new TableItem(table, SWT.NULL); item.setText(0, "" + index++); if (entry.getKey().getDescription() == null) item.setText(1, ""); else item.setText(1, entry.getKey().getDescription()); item.setText(2, entry.getValue()); if (newKeyMap.containsKey(entry.getKey())) item.setText(3, newKeyMap.get(entry.getKey())); else item.setText(3, ""); } for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) { table.getColumn(loopIndex).pack(); } table.setVisible(true); } private void addSelectionListener() { table.addListener(SWT.MouseDown, new Listener() { public void handleEvent(Event event) { Point pt = new Point(event.x, event.y); final TableItem item = table.getItem(pt); if (item != null) { for (int col = 0; col < table.getColumnCount(); col++) { Rectangle rect = item.getBounds(col); if (rect.contains(pt)) { final int column = col; if (column == 3) { TableEditor editor = new TableEditor(table); final Text text = new Text(table, SWT.NONE); text.setEditable(false); editor.grabHorizontal = true; editor.setEditor(text, item, column); text.forceFocus(); text.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent arg0) { newKeyMap.put(ShortcutKeyT.byValue(item .getText(1)), text.getText()); item.setText(3, text.getText()); text.dispose(); } @Override public void focusGained(FocusEvent arg0) { // TODO Auto-generated method stub } }); text.addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent arg0) { if (isConflict(item.getText(1), text.getText())) text.setText("Duplicated!"); else table.forceFocus(); } private boolean isConflict(String desc, String keyStr) { LinkedHashMap<ShortcutKeyT, String> keyMap = ShortcutKeyManager .getInstance().getKeyMap(); for (Entry<ShortcutKeyT, String> entry : keyMap .entrySet()) { if (desc.equals(entry.getKey() .getDescription())) continue; if (newKeyMap.containsKey(entry .getKey()) && newKeyMap.get( entry.getKey()) .equals("") == false && newKeyMap .get(entry.getKey()) .equals("Duplicated!") == false) { if (newKeyMap .get(entry.getKey()) .toLowerCase() .equals(keyStr .toLowerCase())) return true; } else if (entry .getValue() .toLowerCase() .equals(keyStr .toLowerCase())) { return true; } } return false; } @Override public void keyPressed(KeyEvent arg0) { text.setText(KeyCodeStringUtil .getKeyCodeString(arg0)); } }); } } } } } }); } }